package JVM.第03篇_运行时内存篇;

/**
 *                <
 *                | 1/3 1: 新生区(Young)(共十份)  new   Eden ：GC==YGC==轻GC（伊甸区和from）满了
 *                |       8份   1.1:  伊甸园区（Eden Space）满了 （死了一大部分（活得年龄+1））->
 *                |       1份   1.2:  幸存者0区(S0  from) （每一次GC 谁存活(活得年龄+1)放在from） ->
 *                |       1份   1.3:  幸存者1区(S1  to（谁空谁是to）)   （年龄为15（默认）的） ->养老区
 *    堆 heap    <  2/3 2：养老区(old) （再满了）   Full GC==FGC  （筛选(全筛选包括young)）
 *                |        一直满  实在没办法 出现OOM异常(java.lang.OutOfMemoryError)堆内存不足
 *                |
 *                |    3：永久代（jdk7） /元空间（jdk8）
 *                |         //jdk7  （其实在heap 但他自己不认为）
 *                |         //java8 以后原空间不在jvm了  在使用本机物理机
 *                |        永久代是堆的一部分，和新生代，老年代地址是连续的，而元空间属于本地内存
 *                |        元空间存储类的元信息，静态变量和常量池等并入堆中。相当于永久代的数据被分到了堆和元空间中
 *                <
 *
 * 1.new的对象先放伊甸园区。此区有大小限制。
 * 2.当伊甸园的空间填满时，程序又需要创建对象，
 *    JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC/YGC)，
 *    将伊甸园区中的不再被其他对象所引用的对象进行销毁。
 *    再加载新的对象放到伊甸园区
 * 3.然后将伊甸园中的剩余对象移动到幸存者0区。
 * 4.如果再次触发垃圾回收，此时上次幸存下来的放到幸存者0区的，
 *   如果没有回收，就会放到幸存者1区。
 * 5.如果再次经历垃圾回收，此时会重新放回幸存者0区，接着再去幸存者1区。
 * 6.啥时候能去养老区呢?可以设置次数。默认是15次。
 *   可以设置参数: -XX:MaxTenuringThreshold=<N> 设置对象晋升老年代的年龄闽值
 * 7.在养老区，相对悠闲。当养老区内存不足时，再次触发GC: Major GC，
 *   行养老区的内存 清理。
 * 8.若养老区执行了Major GC之后发现依然无法进行对象的保存，就会产生00M异常
 * java.lang.OutOfMemoryError: Java heap space
 *
 * 针对不同年龄段的对象分配原则如下所示:
 * ●优先分配到Eden
 * ●大对象直接分配到老年代
 *          ●尽量避免程序中出现过多的大对象
 * ●长期存活的对象分配到老年代
 * ●动态对象年龄判断
 *          ●如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半，
 *          年龄大于或等于该年龄的对象可以直接进入老年代，
 *          无须等到 MaxTenuringThreshold中要求的年龄。
 * ●空间分配担保
 *      -XX:HandlePromotionFailure
 * Minor GC :YGC
 * 在发生 Minor GC之前，虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间，
 * ● 如果大于，则此次Minor GC是安全的
 * ● 如果小于，则虚拟机会查看-XX:HandlePromotionFailure设置值是否允许担保失败。
 * ●如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否
 * 大于历次晋升到老年代的对象的平均大小，如果大于，则尝试进行一次Minor GC，
 * 但这次Minor GC依然是有风险的:
 * 如果小于或者HandlePromotionFailure=false,则改为进行一次Full GC.
 *
 * 在JDK 6 Update 24之 后，HandlePromotionFailure参数不会再影响到虚拟机的空间分配
 * 担保策略，观察OpenJDK中的源码变化，虽然源码中还定义了HandlePromotionFailure参数，
 * 但是在代码中已经不会再使用它。JDK 6 Update 24之后的规则变为只要老年代的连续
 * 空间大于新生代对象总大小或者历次晋升的平均大小就会进行MinorGC，否则将进行Full GC.
 *
 */
public class E3_堆垃圾回收过程剖析 {

}
